package com.rover022.flixelgame.manager
{
	import com.rover022.flixelgame.GameConfig;
	import com.rover022.flixelgame.ui.equipupgrade.GeneralityGridUI;
	import com.rover022.flixelgame.vo.HeroVo;
	import com.rover022.flixelgame.vo.ItemVo;
	import flash.utils.Dictionary;

	/**
	 * 道具管理类
	 * 1道具
	 * 2装备
	 * @author flashpig
	 *
	 */
	public class ItemManager
	{
		private static var _instance:ItemManager;
		public var itemDict:Dictionary=new Dictionary();

		public function ItemManager()
		{
		}

		public static function getInstance():ItemManager
		{
			if (null == _instance)
			{
				_instance=new ItemManager();
			}
			return _instance;
		}

		/**
		 * 丢弃装备
		 * @param vo
		 */
		public function dropItem(vo:ItemVo, num:uint=1):void
		{
		}

		/**
		 * 获取这个id的道具 count数量
		 * 获得装备
		 * 最大堆叠个数99 多的会丢弃掉
		 * @param itemId
		 * @param itemCount
		 *
		 */
		public function addItemByID(itemId:String, itemCount:int=1):ItemVo
		{
			var useritem:ItemVo=this.getItemFromUser(itemId);
			if (useritem == null)
			{
				var itemvo:ItemVo=ItemManager.getInstance().getItemFromConfig(itemId);
				itemvo.count=itemCount;
				PlayerManager.getInstance().owerUserVo.items.push(itemvo);
				return itemvo;
			}
			else
			{
				useritem.count+=itemCount;
				return useritem;
			}
		}

		/**
		 * 显示这个道具可以合成的道具数组
		 * @return
		 *
		 */
		public function showCompositeItems(src:ItemVo):Array
		{
			return null;
		}

		/**
		 * 显示所有可以合成的道具数组
		 * @return
		 *
		 */
		public function showAllCanCompositeItems():Array
		{
			return null;
		}

		/**
		 * 依靠ItemID检查角色是否拥有这个道具的合成所需材料
		 * @param checkItem
		 *
		 */
		public function checkRequirementByID(id:String):Boolean
		{
			var checkItem:ItemVo=getItemFromConfig(id);
			return checkRequirementByVo(checkItem);
		}

		/**
		 * 依靠ItemVo检查角色是否拥有这个道具的合成所需材料
		 * @param checkItem
		 *
		 */
		public function checkRequirementByVo(checkItem:ItemVo):Boolean
		{
			var items:Array=checkItem.compositeItems;
			for (var i:int=0; i < checkItem.compositeItems.length; i++)
			{
				var vo:ItemVo=checkItem.compositeItems[0];
				if (getTopCountsBy(vo.id) < vo.count)
				{
					return false;
				}
			}
			return true;
		}

		/**
		 * 检查角色是否拥有这个id的全部材料数量
		 * @param checkItem
		 */
		public function getTopCountsBy(id:String):uint
		{
			var items:Array=PlayerManager.getInstance().getAllItems();
			var num:uint=0;
			for (var i:int=0; i < items.length; i++)
			{
				var vo:ItemVo=items[i];
				if (items[i].id == id)
				{
					num+=vo.count;
				}
			}
			return num;
		}

		/**
		 * 从配置档案里面取一个道具的样本出来
		 *
		 */
		public function getItemFromConfig(id:String):ItemVo
		{
			if (itemDict)
			{
				var itemVo:ItemVo=itemDict[id];
				if (itemVo)
				{
					return itemVo.copy();
				}
				else
				{
					return null;
				}
			}
			for (var i:int=0; i < GameConfig.itemData.RECORD.length(); i++)
			{
				var tempid:String=GameConfig.itemData.RECORD[i].@id;
				if (tempid == id)
				{
					var itemvo:ItemVo=makeItemFromXml(GameConfig.itemData.RECORD[i]);
					return itemvo;
				}
			}
			return null;
		}

		private function getArrayFormString(_string:String):Array
		{
			var array:Array=[];
			if (_string.length > 0)
			{
				var _temparray:Array=_string.split("|");
				for (var i:int=0; i < _temparray.length; i++)
				{
					var _somearray:Array=_temparray[i].split(",");
					array.push(_somearray);
				}
			}
			return array;
		}

		/**
		 * 从玩家档案里面找到一个道具出来
		 *
		 */
		public function getItemFromUser(id:String):ItemVo
		{
			var items:Array=PlayerManager.getInstance().owerUserVo.items;
			for (var i:int=0; i < items.length; i++)
			{
				var item:ItemVo=items[i];
				if (item.id == id)
				{
					return item
				}
			}
			return null;
		}

		/**
		 * 制作一个 道具显示单元
		 * @param itemvo
		 * @return
		 *
		 */
		public function makeGeneralityGrid(itemvo:*):GeneralityGridUI
		{
			var grid:GeneralityGridUI;
			if (itemvo is ItemVo)
			{
				grid=new GeneralityGridUI(GeneralityGridUI.ITEMTYPE);
				grid.gridWidth=grid.gridHeight=86;
				grid.picWidth=grid.picHeight=78;
				grid.centerImage();
			}
			else if (itemvo is HeroVo)
			{
				grid=new GeneralityGridUI(GeneralityGridUI.HEROTYPE);
				grid.gridWidth=grid.gridHeight=106;
				grid.picWidth=grid.picHeight=104;
				grid.centerImage();
			}
			else
			{
				return null;
			}
			grid.setDate(itemvo);
			return grid;
		}

		/**
		 * 检查这个id能否被合成...初始化时候被建立...
		 * @param makeId
		 * @return
		 */
		public function canMakeItem(makeId:String):Boolean
		{
			var itemVo:ItemVo=getItemFromConfig(makeId);
			for (var i:int=0; i < itemVo.needCompositeItems.length; i++)
			{
				var array:Array=itemVo.needCompositeItems[i]
				var itemid:String=array[0];
				var itemCount:int=array[1];
				var userItem:ItemVo=getItemFromUser(itemid);
				if (userItem == null || userItem.count < itemCount)
				{
					return false;
				}
			}
			return true;
		}

		/**
		 * 制作道具副本
		 *
		 */
		public function makeItemDictionary():void
		{
			for (var i:int=0; i < GameConfig.itemData.RECORD.length(); i++)
			{
				var tempid:String=GameConfig.itemData.RECORD[i].@id;
				var itemvo:ItemVo=makeItemFromXml(GameConfig.itemData.RECORD[i]);
				itemDict[tempid]=itemvo;
			}
		}

		/**
		 * 建立关系图表
		 *
		 */
		public function makeItemRelationship():void
		{
			for each (var item:ItemVo in itemDict)
			{
				for (var j:int=0; j < item.compositeItems.length; j++)
				{
					var makeid:String=item.compositeItems[j][0];
					var makecout:int=item.compositeItems[j][1];
					var target:ItemVo=itemDict[makeid];
					var isContain:Boolean=false;
					for (var i:int=0; i < target.needCompositeItems.length; i++)
					{
						if (target.needCompositeItems[i][0] == makeid)
						{
							target.needCompositeItems[i][1]+=makecout;
							break;
						}
					}
					if (isContain == false)
					{
						var getArray:Array=[item.id, makecout];
						target.needCompositeItems.push(getArray);
					}
				}
			}
		}

		public function makeItemFromXml(xmllist:XML):ItemVo
		{
			var itemvo:ItemVo=new ItemVo();
			itemvo.id=xmllist.@id;
			itemvo.name=xmllist.@name;
			var cString:String=String(xmllist.@compositeItems);
			itemvo.compositeItems=getArrayFormString(cString);
			itemvo.imageUrl=xmllist.@imageUrl;
			return itemvo;
		}
	}
}
